//
//  RichTextViewDelegate.swift
//  Proton
//
//  Created by Rajdeep Kwatra on 7/1/20.
//  Copyright © 2020 Rajdeep Kwatra. All rights reserved.
//
//  Licensed under the Apache License, Version 2.0 (the "License");
//  you may not use this file except in compliance with the License.
//  You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//

import Foundation
import UIKit

public enum EditorKey {
    case enter
    case backspace
    case tab
    case other(UIKey)

    init?(_ key: UIKey) {
        switch key.keyCode {
        case .keyboardDeleteOrBackspace:
            self = .backspace
        case .keyboardTab:
            self = .tab
        case .keyboardReturnOrEnter:
            self = .enter
        default:
            self = .other(key)
        }
    }

    init?(_ string: String) {
            switch string {
            case "\t":
                self = .tab
            case "\n", "\r":
                self = .enter
            default:
                return nil
            }
        }
}

extension EditorKey: Equatable {
    public static func == (lhs: Self, rhs: Self) -> Bool {
        switch (lhs, rhs) {
        case (.backspace, .backspace),
            (.tab, .tab),
            (.enter, .enter):
            return true
        case (.other(let lKey), .other(let rKey)):
            return lKey == rKey
        default:
            return false
        }
    }
}

protocol RichTextViewDelegate: AnyObject {
    func richTextView(_ richTextView: RichTextView, didChangeSelection range: NSRange, attributes: [NSAttributedString.Key: Any], contentType: EditorContent.Name)
    func richTextView(_ richTextView: RichTextView, shouldHandle key: EditorKey, modifierFlags: UIKeyModifierFlags, at range: NSRange, handled: inout Bool)
    func richTextView(_ richTextView: RichTextView, didReceive key: EditorKey, modifierFlags: UIKeyModifierFlags, at range: NSRange)
    func richTextView(_ richTextView: RichTextView, didReceiveFocusAt range: NSRange)
    func richTextView(_ richTextView: RichTextView, didLoseFocusFrom range: NSRange)
    func richTextView(_ richTextView: RichTextView, didFinishLayout finished: Bool)
    func richTextView(_ richTextView: RichTextView, didChangeTextAtRange range: NSRange)
    func richTextView(_ richTextView: RichTextView, didTapAtLocation location: CGPoint, characterRange: NSRange?)
    func richTextView(_ richTextView: RichTextView, selectedRangeChangedFrom oldRange: NSRange?, to newRange: NSRange?)
    func richTextView(_ richTextView: RichTextView, shouldSelectAttachmentOnBackspace attachment: Attachment) -> Bool?
    func richTextView(_ richTextView: RichTextView, didChangeScrollEnabled isScrollEnabled: Bool)
}

protocol RichTextViewListDelegate: AnyObject {
    var listLineFormatting: LineFormatting { get }
    func richTextView(_ richTextView: RichTextView, listMarkerForItemAt index: Int, level: Int, previousLevel: Int, attributeValue: Any?) -> ListLineMarker
}
